package com.hb.core.pojo.project.section.mapper;

import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hb.core.pojo.RoleDataAuthEntity;
import com.hb.core.pojo.parent.PageResult;
import com.hb.core.pojo.project.evaluation.vo.EvaluationProjectAndSectionInfoVO;
import com.hb.core.pojo.project.notice.dto.TenderInviteEnterpriseDTO;
import com.hb.core.pojo.project.proj.dto.BidProjectDTO;
import com.hb.core.pojo.project.proj.entity.AbstractProject;
import com.hb.core.pojo.project.section.dto.BidSectionDTO;
import com.hb.core.pojo.project.section.dto.SupplyBidSignupDTO;
import com.hb.core.pojo.project.section.entity.BidSection;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 * 采购方案/标段(包)信息表 Mapper 接口
 * </p>
 *
 * @author zhaojk
 * @since 2021-08-30
 */
public interface BidSectionMapper extends BaseMapper<BidSection> {

    /**
     * 根据公告的id去查询所有的标段售价
     *
     * @param noticeId
     * @return
     */
    List<JSONObject> findSectionPriceByNoticeId(@Param("noticeId") Long noticeId);

    /**
     * 根据公告id去查询所有的标段信息
     *
     * @param noticeId
     * @return
     */
    List<BidSectionDTO> findSectionBondByNoticeId(@Param("noticeId") Long noticeId);

    /**
     * 查询指定公告下的标段列表
     *
     * @param noticeId
     * @return
     */
    @Select("select * from trade_bid_section s where " + "exists(select 1 from trade_notice_bid_section nb " + "where nb.notice_id=#{noticeId} and nb.section_id=s.id)")
    List<BidSectionDTO> getSectionsByNoticeId(Long noticeId);

    /**
     * 根据标段id查询标段信息和项目信息
     *
     * @param sectionId
     * @return
     */
    @Select("select " + "tbs.section_name," + "tbs.section_code," + "tbs.open_bid_time," + "tbs.section_status," + "tp.project_name, " + "tbs.file_id, " + "tp.id as projectId, " + "tp.project_module as projectModule, " + "tp.common_type as commonType, " + "tp.project_code, " + "tp.project_type, " + "tbs.sign_start_time, " + "tbs.sign_end_time, " + "tbs.id, " + "tbs.bond_pay_type, " + "tbs.document_sale_end_time, " + "tp.bid_way, " + "tp.org_id, " + "tp.agency_organize_info,  " + "tbs.system_use_fee, " + "tbs.control_price " + "from " + "trade_bid_section tbs " + "left join trade_project tp on tp.id = tbs.project_id " + "where tbs.id = #{sectionId} limit 1")
    BidSectionDTO getBidAndProjectBySectionId(@Param("sectionId") Long sectionId);

    EvaluationProjectAndSectionInfoVO bidProjectAndSectionInfoBySectionId(@Param("sectionId") Long sectionId);

    /**
     * 通过指定的标段ID查询所有标段信息(卧槽 ? ? ?)
     *
     * @param sectionId
     * @return
     */
    @Select("select * from trade_bid_section bs " + "where bs.project_id=(select project_id from trade_bid_section bs2 " + "where bs2.id=#{sectionId})")
    List<BidSection> listSections(Long sectionId);

    /**
     * 根据标段id查询最高限价信息
     *
     * @param sectionId
     * @return
     */
    List<BidSection> findLimitConfigInfoBySectionId(@Param("sectionId") Long sectionId);

    /**
     * 获取当前所有的标段信息
     * 临时用于异议投诉功能的标段选择列表
     *
     * @return
     */
    @Select("SELECT s.id, s.section_name,p.project_name FROM `trade_bid_section` s " + "left join trade_project p on s.project_id=p.id where p.id is not null")
    List<BidSectionDTO> allSections();

    /**
     * 获取该标段状态下的所有操作台按钮
     *
     * @param statusId 标段状态Id
     * @param roleSign 前登录用户所属机构类型
     * @param bidWay   招标方式
     * @return
     */
    List<JSONObject> listConsoleItems(@Param("statusId") Long statusId, @Param("roleSign") Integer roleSign, @Param("bidWay") Integer bidWay);

    /**
     * 查询指定公告ID下的标段列表
     *
     * @param noticeId
     * @return
     */
    @Select("select * from trade_bid_section bs where bs.id in " + "(select nbs.section_id from trade_notice_bid_section nbs " + "left join trade_notice n on nbs.notice_id=n.id where n.id=#{noticeId})")
    List<BidSectionDTO> findBidSectionsByNoticeId(Long noticeId);

    /**
     *
     * @Description: 根据项目查询已经发布过公告(除控制价公告)的的标段列表
     * @Author: zhongdl
     * @Date:2021/12/27 14:57
     * @param projectId:  项目id
     * @return: {@link List< BidSection> }
     **/
    List<BidSection> listReleaseNotice(Long projectId);

    /**
     *
     * @Description:投标人我的项目
     * @Author: zhongdl
     * @Date:2022/1/4 9:06
     * @param bidSection:
     * @param type:
     *      type == 1 投标人我的项目条件为
     *      * (1 ):需要报名的项目 报名成功 到 我的项目
     *      *  (2 ):不需要报名的项目需要购买文件  购买完文件 到我的项目
     *      *  (3 ): 不需要报名的项目不要购买文件 下载完文件 到 我的项目
     * @param type:1 项目大厅条件 2 我的项目条件
     * @return: {@link PageResult< BidSectionDTO> }
     **/
    Page<BidSectionDTO> pageMyProject(@Param("page") Page pages, @Param("bidSection") BidSectionDTO bidSection, @Param("type") Integer type);

    /**
     * 根据项目Id查询标段列表分页
     *
     * @param pages
     * @param projectId
     * @return
     */
    Page<SupplyBidSignupDTO> pageSectionListByProjectId(@Param("page") Page pages, @Param("projectId") Long projectId);

    /**
     * 邀请书下的标段信息  返回实体类dto不一样
     *
     * @param pages
     * @param projectId
     * @return
     */
    Page<TenderInviteEnterpriseDTO> pageInvitationSectionListByProjectId(@Param("page") Page pages, @Param("projectId") Long projectId);

    /**
     * 投标人查询当前用户下的标段（投诉异议使用）。支持级联查询
     * @param bidProjectDTO
     * @return
     */
    List<AbstractProject> listSupplyBidSignup(@Param("query") BidProjectDTO bidProjectDTO);

    /**
     *
     * @Description: 查询参与标段的
     * @Author: zhongdl
     * @Date:2022/2/19 9:09
     * @param sectionId:
     * @return: {@link List< Long> }
     **/
    List<Long> listParticipateSection(@Param("sectionId") Long sectionId);

    /**
     *根据企业ID查询未递交投标文件的标段
     * @param bidSectionDTO
     * @return
     * @Author: ljs
     * @Date:2022-2-18 18:17:52
     */
    Page<BidSectionDTO> pageNotSubmitSection(@Param("page") Page pages, @Param("query") BidSectionDTO bidSectionDTO);

    /**
     *
     * @Description: 根据开标时间查询开标列表
     * @Author: zhongdl
     * @Date:2022/2/19 11:16
     * @param openBidTime:
     * @return: {@link java.util.List<com.hb.core.pojo.project.section.dto.BidSectionDTO> }
     **/
    List<BidSectionDTO> listBidSectionByOpenBidTime(@Param("openBidTime") LocalDateTime openBidTime);

    /**
     * 获取标段的基本信息
     * @author tian
     * @date 2022-2-21 15:20
     * @param id
     * @return com.hb.core.pojo.project.section.dto.BidSectionDTO
     */
    BidSectionDTO findBidSectionInfoById(Long id);

    /**
     * 招标人根据月份查询当前用户 具有开标安排的日期
     * @param month
     * @return
     */
    List<BidSectionDTO> openDateList(@Param("dateYear") Integer year, @Param("dateMonth") Integer month, @Param("createId") Long createId);

    /**
     * 投标人根据月份查询当前用户 具有开标安排的日期
     * @param month
     * @return
     */
    List<BidSectionDTO> openDateListTender(@Param("dateYear") Integer year, @Param("dateMonth") Integer month, @Param("createId") Long createId);

    /**
     * 根据项目id 查询标段
     *
     * @param bidSectionDTO
     * @return
     */
    Page<BidSectionDTO> selectListByProjectId(@Param("page") Page pages, @Param("query") BidSectionDTO bidSectionDTO);

    /**
     * 根据投诉异议的ID查询对弈的标段信息
     * @param clarifyId
     * @return
     */
    List<BidSectionDTO> listBidSectionByClarify(Long clarifyId);

    List<String> getTenderOrgByProjectId(@Param("projectId") String projectId);

    /**
     * 查询标段的招标形式
     * @author tian
     * @date 2022-4-20 10:27
     * @param sectionId
     * @return java.lang.Integer
     */
    Integer selectBidWayBySectionId(Long sectionId);

    /**
     * 招标人发布的项目数量
     * @param bidderId
     * @return
     */
    Integer countSectionByBidder(@Param("bidderId") Long bidderId);

    /**
     * 招标人发布的项目中已完成的项目数量
     * @param bidderId
     * @return
     */
    Integer countFinishedSectionByBidder(@Param("bidderId") Long bidderId);

    Integer countFailSectionByBidder(@Param("bidderId") Long bidderId);

    /**
     * 正在进行的项目（排除发布了中标结果和流程的项目）
     *
     * @author tian
     * @date 2022-5-19 18:16
     * @param bidderId
     * @return java.lang.Integer
     */
    Integer countUnderwaySectionByBidder(@Param("bidderId") Long bidderId);

    Integer countTenderFailSectionByBidder(@Param("bidderId") Long bidderId);

    /**
     * 根据 dataAuth 查询统计数量
     * @param dataAuth
     * @param statusList
     * @return
     */
    Integer countSectionByDataAuth(@Param("dataAuth") RoleDataAuthEntity dataAuth, @Param("statusList") List<Long> statusList);

    /**
     * 查询标段开标设置的创建人id
     *
     * @author tian
     * @date 2022-6-20 15:17
     * @param id 标段id
     * @return java.lang.Long
     */
    Long selectOpeningSetCreateIdByBidId(Long id);

    /**
     * @Description: 根据标段ID集合查询标段详情 附带该标段是否开标(openFlag)
     *
     * @author yuezheng
     * @param sectionIdList
     * @return java.util.List<com.hb.core.pojo.project.section.entity.BidSection>
     * @date 2022/6/27 16:21
     */
    List<BidSection> selectListByIds(@Param("sectionIdList") List<Long> sectionIdList);
}
